package editor.cn;

import java.util.Stack;

class Solution394 {
    public static void main(String[] args) {
        Solution solution = new Solution394().new Solution();
        String s = "3[a2[bc]]";
        System.out.println(solution.decodeString(s));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        //本题能够很好的考察基本操作，事实上，关于括号的问题，栈是最优解，做法就是遍历每一个字母，然后将值做不同的处理。一般是存放在栈结构里面。
        //本解法就是针对4中不同的情况分类处理@@@很好的！！！遇到`][`你也不怕，只有遇到char你才append()
        public String decodeString(String s) {
            //栈化处理(遍历+处理)
            return stack(s);
        }

        private String stack(String s) {
            //    栈化,使用辅助栈来完成叠加的情况，数字栈保存获取到的数字，字符栈保存获取到的字符。
            Stack stackNum = new Stack<Integer>();
            Stack stackStr = new Stack<String>();
            StringBuilder t = new StringBuilder();
            int mult = 0;
            //用来计数连续的数字，多位数
            char[] charArray = s.toCharArray();
            for (char ch : charArray) {
                if (ch == '[') {
                    // 压栈保存之前的数字
                    stackNum.add(mult);
                    // 这里的数字与字符串就要进栈了，确保后面获取到']'时能够以正确的顺序找到
                    // 压栈保存之前的字符串，不管这个'['
                    stackStr.add(t.toString());
                    t = new StringBuilder("");//重置t
                    mult = 0;
                } else if (ch == ']') {

                    // 取出栈中的数字与字符串,叠加追尾了
                    // 取出数字
                    //这里一定要注意是单独的重新的数字
                    int multCurrent = (int) stackNum.removeLast();
                    // 取出字符
                    String str = (String) stackStr.removeLast();
                    // 完成拼接
                    t = new StringBuilder(str + t.toString().repeat(multCurrent));

                } else if (Character.isDigit(ch)) {
                    //   如果是数字则将计算出，待只计算完毕后，在压栈，也就是在ch='['时，注意这里有多位数的出现以及转换
                    mult = mult * 10 + Integer.parseInt(String.valueOf(ch));

                } else {
                    t.append(ch);
                }
            }
            return t.toString();
        }
    }
        //leetcode submit region end(Prohibit modification and deletion)

}